-- 1, 2, 3, 4, 5, 6, 7 这是你的元素
-- ZREMRANGEBYSCORE key1 0 6
-- 7 执行完之后

-- 限流对象
local key = KEYS[1]
-- 窗口大小
local window = tonumber(ARGV[1])
-- 阈值
local threshold = tonumber( ARGV[2])
local now = tonumber(ARGV[3])
-- 窗口的起始时间
local min = now - window

redis.call('ZREMRANGEBYSCORE', key, '-inf', min)
local cnt = redis.call('ZCOUNT', key, '-inf', '+inf')
-- local cnt = redis.call('ZCOUNT', key, min, '+inf')
if cnt >= threshold then
    -- 执行限流
    return "true"
else
    -- 把 score 和 member 都设置成 now
    redis.call('ZADD', key, now, now)
    redis.call('PEXPIRE', key, window)
    return "false"
end



-- 这是一个Lua脚本，使用Redis命令来实现一个简单的滑动窗口计数算法
-- 它的功能是将每个请求的时间戳存储在一个有序集合中，并在给定的时间窗口内统计请求数量
-- 如果超过阈值则返回true，否则返回false。
-- 该脚本的实现逻辑如下：
-- 根据传入的参数，将KEYS和ARGV分别赋值给对应的变量。
-- 将ARGV中的第1个元素转换为数字类型，表示时间窗口的大小。
-- 将ARGV中的第2个元素转换为数字类型，表示请求阈值。
-- 将ARGV中的第3个元素转换为数字类型，表示当前的时间戳。
-- 计算窗口的最小时间戳。
-- 通过ZREMRANGEBYSCORE命令移除有序集合中时间戳小于min的元素。
-- 使用ZCOUNT命令获取有序集合中的元素数量。
-- 如果元素数量超过或等于阈值，则返回true。
-- 使用ZADD命令将当前时间戳加入有序集合，并将其设置为过期时间为窗口的大小
-- 返回false。
-- 需要注意的是，这段Lua脚本使用了Redis的一些特定命令和函数，并结合了条件判断和计数等逻辑。
-- 您可以将其作为一个Redis的脚本使用，将其Lua脚本传给Redis进行执行。

